/******************************************************************************************
 * Import
 ******************************************************************************************/

// module
import _ from 'lodash';
import {AsyncStorage} from 'react-native';

/******************************************************************************************
 * Export Class
 ******************************************************************************************/

/**
 * 请求设置对象结构：
 * {
 *      key: string,            // 需要获取的key值                          （全部使用）
 *      value: any,             // 需要设置的值                             （仅set使用）
 *      success(data)=> {},     // 成功回调函数                             （全部使用）
 * }
 */
export default class Storage {

    /*------------------------------------------------------------------------------------
	 * 外部调用接口
	 *-----------------------------------------------------------------------------------*/
    /**
     * 获取一个Storage条目
     * 
     * @param {Object} obj 设置对象
     */
    static get(obj) {
        AsyncStorage.getItem(obj.key, (err, res)=> {

            // 如果出错，则收集错误
            if (err) {
                this._collecFail(err, obj)
                return;
            }

            // 声明result，并查看是否返回了null或undefined（null或undefined为无值），如果不是则将result = res
            let result = null;
            if (!_.isNil(res)) {
                result = res;
            }

            // 获取正确，调用success，注意JSON.parse。注意：不允许存储html
            if (_.isFunction(obj.success)) {
                obj.success(JSON.parse(result));
            }
        });
    }

    /** 
     * 设置一个Storage条目
     * 
     * @param {Object} obj 设置对象
     */
    static set(obj) {
        AsyncStorage.setItem(obj.key, JSON.stringify(obj.value), (err)=> {

            // 如果出错，则收集错误
            if (err) {
                this._collecFail(err, obj)
                return;
            }

            // 设置正确，调用success
            if (_.isFunction(obj.success)) {
                obj.success();
            }
        });
    }

    /*------------------------------------------------------------------------------------
	 * 错误收集方法
	 *-----------------------------------------------------------------------------------*/
    /**
     * 收集错误
     * 注意：一但storage出现错误，则直接上传到服务器的错误收集接口
     * 
     * @param {Any} err 错误信息
     * @param {Object} obj 原始设置对象
     */
    static _collecFail(err, obj) {
        // console.log(res);
    }
}
